﻿2026-05-10T12:17:58.0486815Z ##[group]Run pnpm verify:phase-4
2026-05-10T12:17:58.0487138Z [36;1mpnpm verify:phase-4[0m
2026-05-10T12:17:58.0510589Z shell: /usr/bin/bash -e {0}
2026-05-10T12:17:58.0510845Z env:
2026-05-10T12:17:58.0511109Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T12:17:58.0511629Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T12:17:58.0511863Z   SKIP_TRACE_CHECK: 1
2026-05-10T12:17:58.0512074Z ##[endgroup]
2026-05-10T12:17:58.3462795Z 
2026-05-10T12:17:58.3463599Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T12:17:58.3464676Z > node scripts/verify-phase-4.mjs
2026-05-10T12:17:58.3465224Z 
2026-05-10T12:17:58.3780972Z 
2026-05-10T12:17:58.3781848Z === Workspace: typecheck ===
2026-05-10T12:17:58.3782602Z >>> pnpm -r typecheck
2026-05-10T12:17:58.6726375Z Scope: 5 of 6 workspace projects
2026-05-10T12:17:58.6778839Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T12:17:58.6788214Z packages/db typecheck$ tsc --noEmit
2026-05-10T12:18:01.0844734Z packages/game-logic typecheck: Done
2026-05-10T12:18:01.0853941Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T12:18:03.1839703Z packages/db typecheck: Done
2026-05-10T12:18:04.4891498Z packages/protocol typecheck: Done
2026-05-10T12:18:04.4902546Z apps/client typecheck$ tsc --noEmit
2026-05-10T12:18:04.4907607Z apps/server typecheck$ tsc --noEmit
2026-05-10T12:18:14.9696764Z apps/client typecheck: Done
2026-05-10T12:18:15.9691394Z apps/server typecheck: Done
2026-05-10T12:18:15.9801243Z 
2026-05-10T12:18:15.9801859Z === Lint: protocol-sync ===
2026-05-10T12:18:15.9802755Z >>> pnpm lint:protocol-sync
2026-05-10T12:18:16.2700869Z 
2026-05-10T12:18:16.2701609Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T12:18:16.2702132Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T12:18:16.2702365Z 
2026-05-10T12:18:16.3008047Z lint-protocol-sync: OK
2026-05-10T12:18:16.3135086Z 
2026-05-10T12:18:16.3135884Z === Lint: game-logic-purity ===
2026-05-10T12:18:16.3136639Z >>> pnpm lint:game-logic-purity
2026-05-10T12:18:16.6017667Z 
2026-05-10T12:18:16.6019018Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T12:18:16.6020343Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T12:18:16.6021013Z 
2026-05-10T12:18:16.6364842Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T12:18:16.6489602Z 
2026-05-10T12:18:16.6490204Z === Lint: better-auth-schema-sync ===
2026-05-10T12:18:16.6491010Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T12:18:16.9344157Z 
2026-05-10T12:18:16.9345405Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:18:16.9346598Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T12:18:16.9347211Z 
2026-05-10T12:18:18.5395787Z lint-better-auth-schema-sync: OK
2026-05-10T12:18:18.5529613Z 
2026-05-10T12:18:18.5530111Z === Lint: rate-limit-budgets ===
2026-05-10T12:18:18.5530667Z >>> pnpm lint:rate-limit-budgets
2026-05-10T12:18:18.8392676Z 
2026-05-10T12:18:18.8393738Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T12:18:18.8394775Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T12:18:18.8395279Z 
2026-05-10T12:18:18.8712502Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T12:18:18.8840930Z 
2026-05-10T12:18:18.8841586Z === Lint: no-clipboard-rce ===
2026-05-10T12:18:18.8842290Z >>> pnpm lint:no-clipboard-rce
2026-05-10T12:18:19.1756209Z 
2026-05-10T12:18:19.1757349Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T12:18:19.1758557Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T12:18:19.1759039Z 
2026-05-10T12:18:19.2096234Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T12:18:19.2222099Z 
2026-05-10T12:18:19.2233613Z === Lint: room-layout ===
2026-05-10T12:18:19.2234114Z >>> pnpm lint:room-layout
2026-05-10T12:18:19.5104195Z 
2026-05-10T12:18:19.5105309Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T12:18:19.5106521Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T12:18:19.5107975Z 
2026-05-10T12:18:19.5475400Z lint-room-layout: OK
2026-05-10T12:18:19.5602113Z 
2026-05-10T12:18:19.5602553Z === ADR 0004 lint ===
2026-05-10T12:18:19.5603205Z >>> pnpm lint:adr:0004
2026-05-10T12:18:19.8495529Z 
2026-05-10T12:18:19.8496664Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T12:18:19.8498840Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T12:18:19.8499928Z 
2026-05-10T12:18:19.8829239Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:18:19.8950335Z 
2026-05-10T12:18:19.8950848Z === Drizzle: emit-check ===
2026-05-10T12:18:19.8951451Z >>> pnpm db:emit-check
2026-05-10T12:18:20.1842033Z 
2026-05-10T12:18:20.1843170Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T12:18:20.1846113Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T12:18:20.1848482Z 
2026-05-10T12:18:20.6152013Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T12:18:20.6153862Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T12:18:21.0399895Z 8 tables
2026-05-10T12:18:21.0400648Z accounts 8 columns 1 indexes 0 fks
2026-05-10T12:18:21.0401488Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T12:18:21.0404721Z characters 9 columns 0 indexes 1 fks
2026-05-10T12:18:21.0405578Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T12:18:21.0406432Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T12:18:21.0407300Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T12:18:21.0411411Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T12:18:21.0412395Z sessions 5 columns 0 indexes 1 fks
2026-05-10T12:18:21.0412928Z 
2026-05-10T12:18:21.0413809Z No schema changes, nothing to migrate 😴
2026-05-10T12:18:21.6718183Z 
2026-05-10T12:18:21.6719029Z === Drizzle: schema-sync ===
2026-05-10T12:18:21.6719997Z >>> pnpm lint:schema-sync
2026-05-10T12:18:21.9552063Z 
2026-05-10T12:18:21.9553190Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:18:21.9556454Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T12:18:21.9559020Z 
2026-05-10T12:18:21.9831776Z OK
2026-05-10T12:18:21.9962871Z 
2026-05-10T12:18:21.9963480Z === Drizzle: source-comments ===
2026-05-10T12:18:21.9964265Z >>> pnpm lint:source-comments
2026-05-10T12:18:22.2826034Z 
2026-05-10T12:18:22.2827235Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T12:18:22.2828823Z > pnpm -C packages/db run lint:source-comments
2026-05-10T12:18:22.2829428Z 
2026-05-10T12:18:22.5758834Z 
2026-05-10T12:18:22.5759879Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T12:18:22.5761055Z > node scripts/check-source-comments.mjs
2026-05-10T12:18:22.5761699Z 
2026-05-10T12:18:22.6079934Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T12:18:22.6300646Z 
2026-05-10T12:18:22.6301319Z === Workspace: test ===
2026-05-10T12:18:22.6301991Z >>> pnpm -r test
2026-05-10T12:18:22.9396719Z Scope: 5 of 6 workspace projects
2026-05-10T12:18:22.9448582Z packages/db test$ vitest run
2026-05-10T12:18:22.9457159Z packages/game-logic test$ vitest run
2026-05-10T12:18:23.4525801Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T12:18:23.4559211Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T12:18:23.7750631Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:18:24.0159972Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T12:18:24.2449830Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:18:24.4456431Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:18:24.4720247Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:18:24.4831113Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:18:24.4849072Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T12:18:24.4850208Z packages/game-logic test: [2m   Start at [22m 12:18:23
2026-05-10T12:18:24.4851557Z packages/game-logic test: [2m   Duration [22m 1.02s[2m (transform 117ms, setup 0ms, import 196ms, tests 43ms, environment 1ms)[22m
2026-05-10T12:18:24.5225154Z packages/game-logic test: Done
2026-05-10T12:18:24.5238482Z packages/protocol test$ vitest run
2026-05-10T12:18:24.6650424Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:18:25.0229214Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T12:18:25.4054947Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T12:18:25.4774039Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:18:25.4826000Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T12:18:25.4848960Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T12:18:25.4868620Z packages/db test: [2m   Start at [22m 12:18:23
2026-05-10T12:18:25.4889235Z packages/db test: [2m   Duration [22m 2.02s[2m (transform 182ms, setup 0ms, import 1.43s, tests 27ms, environment 0ms)[22m
2026-05-10T12:18:25.5177520Z packages/db test: Done
2026-05-10T12:18:25.6224390Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:18:25.7814838Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:18:25.9268885Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:18:25.9323218Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:18:25.9344692Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T12:18:25.9345844Z packages/protocol test: [2m   Start at [22m 12:18:25
2026-05-10T12:18:25.9347164Z packages/protocol test: [2m   Duration [22m 897ms[2m (transform 117ms, setup 0ms, import 240ms, tests 34ms, environment 0ms)[22m
2026-05-10T12:18:25.9656302Z packages/protocol test: Done
2026-05-10T12:18:25.9661660Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T12:18:25.9664267Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T12:18:26.5060058Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T12:18:26.5102056Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T12:18:27.6170052Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 83[2mms[22m[39m
2026-05-10T12:18:27.9313183Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:18:28.0002955Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T12:18:28.0017956Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T12:18:28.0249138Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 171[2mms[22m[39m
2026-05-10T12:18:28.2125543Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-10T12:18:28.5229997Z apps/server test: {"level":40,"time":1778415508519,"pid":3216,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:18:28.5309738Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:18:28.5378637Z apps/server test: {"level":40,"time":1778415508523,"pid":3216,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:18:28.5429187Z apps/server test: {"level":40,"time":1778415508524,"pid":3216,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:18:29.1370201Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:18:29.4288463Z apps/server test: {"level":30,"time":1778415509427,"pid":3228,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T12:18:29.4329391Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 699[2mms[22m[39m
2026-05-10T12:18:29.4354700Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 549[2mms[22m[39m
2026-05-10T12:18:30.3344863Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T12:18:30.3740155Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T12:18:30.3749651Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-SzNb5d/rebno.db
2026-05-10T12:18:30.3759912Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:18:30.3769688Z apps/server test: [run-migrations] OK
2026-05-10T12:18:30.3839077Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T12:18:30.3873298Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-0tJpPd/rebno.db
2026-05-10T12:18:30.3900698Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:18:30.3921121Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T12:18:30.3958626Z apps/server test: [run-migrations] OK
2026-05-10T12:18:30.3960708Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:18:30.3973284Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-R9xvnl/rebno.db
2026-05-10T12:18:30.3988366Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:18:30.4014741Z apps/server test: [run-migrations] OK
2026-05-10T12:18:30.4070015Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:18:30.4086904Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-R9xvnl/rebno.db
2026-05-10T12:18:30.4088927Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:18:30.4128537Z apps/server test: [run-migrations] OK
2026-05-10T12:18:30.4149124Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 45[2mms[22m[39m
2026-05-10T12:18:30.7199940Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-10T12:18:30.9380249Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:18:31.1759850Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T12:18:31.3938148Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:18:31.5179157Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 103[2mms[22m[39m
2026-05-10T12:18:32.0928041Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T12:18:32.0929819Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ custom filepath { path: '/custom/path/.env' }
2026-05-10T12:18:32.0935775Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T12:18:32.7573828Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 116[2mms[22m[39m
2026-05-10T12:18:32.8320113Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:18:32.8359345Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T12:18:32.8398800Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T12:18:32.8438549Z apps/server test: [2m   Start at [22m 12:18:26
2026-05-10T12:18:32.8469213Z apps/server test: [2m   Duration [22m 6.31s[2m (transform 427ms, setup 0ms, import 3.17s, tests 931ms, environment 2ms)[22m
2026-05-10T12:18:32.8871608Z apps/server test: Done
2026-05-10T12:18:33.4719348Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:18:34.1904472Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 71[2mms[22m[39m
2026-05-10T12:18:34.8510208Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:18:35.5169874Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:18:36.1822088Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:18:36.8612842Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-10T12:18:37.5211116Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:18:38.1963028Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:18:38.8434287Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:18:39.5031669Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:18:40.1588633Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:18:40.1799270Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T12:18:40.1815895Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T12:18:40.1821547Z apps/client test: [2m   Start at [22m 12:18:26
2026-05-10T12:18:40.1823340Z apps/client test: [2m   Duration [22m 13.67s[2m (transform 506ms, setup 41ms, collect 799ms, tests 572ms, environment 8.03s, prepare 1.47s)[22m
2026-05-10T12:18:40.3141594Z apps/client test: Done
2026-05-10T12:18:40.3244163Z 
2026-05-10T12:18:40.3244985Z verify-phase-4: OK (12 steps green)
